#include <jni.h>
#include <string>
using namespace std;
extern "C"
jstring calcSum(JNIEnv *env, jclass clazz,jobject objstu) {
    char result[50];

    jclass stucls = env->GetObjectClass(objstu); //得Student类引用


    //下面这些函数操作，我们都见过的。O(∩_∩)O~
    jfieldID ageFieldID = env->GetFieldID(stucls,"age","I"); //获得得Student类的属性id
    jfieldID nameFieldID = env->GetFieldID(stucls,"name","Ljava/lang/String;"); // 获得属性ID

    jint age = env->GetIntField(objstu ,ageFieldID);  //获得属性值
    jstring name = (jstring)env->GetObjectField(objstu , nameFieldID);//获得属性值

    const char * c_name = env->GetStringUTFChars(name ,NULL);//转换成 char *
//
    string str_name = c_name ;
    env->ReleaseStringUTFChars(name,c_name); //释放引用

    sprintf(result, "age:%d,name:%s",age,str_name.c_str());

    return env->NewStringUTF(result);
}

/**
 * JNINativeMethod由三部分组成:
 * (1)Java中的函数名;
 * (2)函数签名,格式为(输入参数类型)返回值类型;
 *  ()Ljava/lang/String; (II)表示需要传两个int型参数，Ljava/lang/String;表示返回String，在对象类名（包括包名，‘/’间隔）前面加L，分号结尾
 * (3)native函数名
 */
static JNINativeMethod gMethods[] = { {"getSumFromJNI", "(Ljava/lang/Object;)Ljava/lang/String;", (void *)calcSum }};

//System.loadLibrary过程中会自动调用JNI_OnLoad，在此进行动态注册
JNIEXPORT jint JNICALL JNI_OnLoad(JavaVM *jvm, void *reserved) {
    JNIEnv *env = NULL;
    jint result = JNI_FALSE;

    //获取env指针
    if (jvm->GetEnv((void**) &env, JNI_VERSION_1_6) != JNI_OK) {
        return result;
    }
    if (env == NULL) {
        return result;
    }
    //获取类引用
    jclass clazz = env->FindClass("com/example/myapplication/MainActivity");
    if (clazz == NULL) {
        return result;
    }
    //注册方法
    if (env->RegisterNatives(clazz, gMethods, sizeof(gMethods) / sizeof(gMethods[0])) < 0) {
        return result;
    }
    //成功
    result = JNI_VERSION_1_6;
    return result;
}
